package org.windey.server.database;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * 
 * persistence database
 *
 */
public class Database {
	
	private static EntityManager em;
	private static EntityManagerFactory emf;
	
	public Database() {
		emf = Persistence.createEntityManagerFactory("WindeyServerPU");
		em = emf.createEntityManager();
		User u = new User();
		u.setEmail("majin.wouter@gmail.com");
		u.setPasword("098f6bcd4621d373cade4e832627b4f6");
		create(u);
	}
	
	/**
	 * lijst met de gebruikers ophalen
	 * @return gebruikerslijst
	 */
	@SuppressWarnings("unchecked")
	public static List<User> getUsers() {
		List<User> users = em.createQuery("select u from User u").getResultList();
		return users;
	}
	
	/**
	 * lijst met pc's ophalen
	 * @return pclijst
	 */
	@SuppressWarnings("unchecked")
	public static List<Pc> getPcs() {
		List<Pc> pcs = em.createQuery("select p from Pc p").getResultList();
		return pcs;
	}
	
	/**
	 * persisteren van een nieuw object
	 * @param o het object
	 * @return het gepersisteerde object
	 */
	public static Object create(Object o) {
		em.getTransaction().begin();
		em.persist(o);
		em.getTransaction().commit();
		return o;
	}
	
	/**
	 * aanpassen van een object 
	 * @param o het aan te passen object
	 * @return het aangepaste object
	 */
	public static Object edit(Object o) {
		em.getTransaction().begin();
		o = em.merge(o);
		em.getTransaction().commit();
		return o;
	}
	
	/**
	 * verwijderen van object uit de database
	 * @param o het te verwijderen object
	 */
	public static void remove(Object o) {
		em.remove(em.merge(o));
	}
	
	/**
	 * afsluiten connectie database
	 */
	public static void close() {
		em.close();
		emf.close();
	}

	/**
	 * om te controleren of een combinatie gebruikersnaam/paswoord bestaat
	 * @param userName de gebruikersnaam
	 * @param passwordHash het paswoord (gehasht)
	 * @return true: bestaat, false: bestaat niet
	 */
	public static boolean checkLogin(String userName, String passwordHash)
	{
		boolean result = false;
		for (User user : getUsers())
		{
			if (user.getEmail().equalsIgnoreCase(userName)
					&& user.getPasword().equalsIgnoreCase(passwordHash))
			{
				result = true;
				break;
			}
		}
		return result;
	}

	/**
	 * haal een User-object uit de databank adhv zijn gebruikersnaam en gehaste paswoord
	 * @param userName de gebruikersnaam
	 * @param passwordHash het gehaste paswoord
	 * @return de gebruiker die werd opgevraagd
	 */
	public static User getUser(String userName, String passwordHash)
	{
		User result = null;
		for (User user : getUsers())
		{
			if (user.getEmail().equalsIgnoreCase(userName)
					&& user.getPasword().equalsIgnoreCase(passwordHash))
			{
				result = user;
				break;
			}
		}
		return result;
	}
	
	/**
	 * haal een gebruiker op adhv het emailadres
	 * @param email het emailadres van de gezochte gebruiker
	 * @return de opgevraagde gebruiker
	 */
	public static User getUserByEmail(String email) {
		User user = ((User)em.createQuery("select u from User u where u.email = '" + email + "'").getSingleResult());
		return user;
	}


}
